#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>

// 有名管道路径
#define FIFO_PATH "/home/gec/123"

int fd;
int fd_file;

// 自定义信号处理函数
void func(int sig)
{
	printf("当前收到的信号=%d\n", sig);
	// 关闭文件，并退出整个进程
	close(fd); // 关闭管道
	close(fd_file); // 关闭文件
	exit(0);
}

int main(int argc, char const *argv[])
{
	printf("当前的pid=%d\n", getpid());
	signal(10, func);
	// 判断管道文件是否存在
	if(access(FIFO_PATH, F_OK) != 0) // 不存在为真
	{
		int ret = mkfifo(FIFO_PATH, 0666);
		if(ret == -1)
		{
			perror("mkfifo error\n");
			return -1;
		}
	}
	// 打开管道文件
	fd = open(FIFO_PATH, O_RDWR);
	if(fd == -1)
	{
		perror("open fifo failed\n");
		return -1;
	}
	// 打开file.txt
	fd_file = open("./file.txt", O_RDWR|O_CREAT|O_TRUNC|O_APPEND, 0777);
	if(fd_file == -1)
	{
		perror("open file failed\n");
		return -1;
	}

	// 读取管道中的数据
	char buf[1024] = {0};
	int n;
	while(1)
	{
		memset(buf, 0, sizeof(buf));
		n = read(fd, buf, 1024);
		printf("n=[%d], buf=%s\n", n, buf);
		if(n == 0)
			break;
		// 把数据写入文件
		write(fd_file, buf, strlen(buf));
	}
	
	
	return 0;
}
